package main

import (
	"doctor_api_backend/fakedata"
	"fmt"
	"log"

	model "doctor_api_backend/models"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var DB *gorm.DB

// sqlite做model初始化,但是没有插入数据
// func InitDBWithSqlite() {
// 	// 连接到SQLite数据库（这里使用SQLite作为示例，你可以根据需要替换为其他数据库）
// 	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
// 	if err != nil {
// 		log.Fatal("failed to connect database")
// 	}

// 	// 删除所有表
// 	if err := dropAllTables(db); err != nil {
// 		log.Fatal("failed to drop tables:", err)
// 	}

// 	// 自动迁移所有模型
// 	if err := db.AutoMigrate(
// 		&model.UserV2{},
// 		&model.Patient{},
// 		&model.Doctor{},
// 		&model.Visit{},
// 		&model.Order{},
// 		&model.LabTest{},
// 		&model.MedicalRecordV2{},
// 		&model.MedicineV2{},
// 		&model.AdmissionNotice{},
// 		&model.WesternMedicline{},
// 		&model.ChineseMedicline{},
// 		&model.ICD_10{},
// 	); err != nil {
// 		log.Fatal("failed to auto migrate:", err)
// 	}
// }

// 使用mysql做生产环境
func InitDBWithMySql() {
	// 获取数据库 DSN 字符串
	dsn := "root:123456@tcp(127.0.0.1:3306)/prod?charset=utf8mb4&parseTime=True&loc=Local"

	// 连接到数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("连接mysql失败: %v", err)
	}
	log.Printf("%v", db)
	// 打印数据库连接成功信息
	fmt.Printf("连接mysql成功: %s\n", dsn)

	// 一开始就删除所有表
	if err := dropAllMySqlTables(db); err != nil {
		// 中文错误
		log.Fatal("删除表失败:", err)
	} else {
		fmt.Println("删除所有表成功")
	}

	initAllTables(db)
	Debug := true
	if Debug {
		generateFakeData()
	}

}

// 生成假数据
func generateFakeData() {

	// 生成病人假数据
	fakedata.SeedPatientData()
	// 生成病种模板假数据
	fakedata.SeedSickTemplate()
	// 生成病历记录假数据
	fakedata.SeedMedicineRecordData()
	// 生成药物假数据
	fakedata.SeedMedicineData()
	// 生成医嘱假数据
	fakedata.SeedMedicalOrder()
	// 生成医生假数据
	fakedata.SeedDoctorData()
	// 生成医生病人映射表假数据
	fakedata.SeedDoctorPatientMapping()
	// 生成入院通知单假数据
	fakedata.SeedAdmissionNotice()
	// 生成病人就诊等待队列假数据
	fakedata.SeedPatientQueue()
}

// 初始化所有表
func initAllTables(db *gorm.DB) {
	// 初始化系统用户表
	db.AutoMigrate(&model.SystemUser{})
	// 初始化病人表
	db.AutoMigrate(&model.Patient{})
	// 初始化病人排队表
	db.AutoMigrate(&model.PatientQueue{})
	// 初始化病种模板表
	db.AutoMigrate(&model.SickTemplate{})
	// 初始化医生表
	db.AutoMigrate(&model.Doctor{})
	// 初始化就诊表
	db.AutoMigrate(&model.Visit{})
	// 初始化实验室检查表
	db.AutoMigrate(&model.LabTest{})
	// 初始化药物表
	db.AutoMigrate(&model.Medicine{})
	// 初始化入院通知表
	db.AutoMigrate(&model.AdmissionNotice{})
	// 初始化西药表
	db.AutoMigrate(&model.WesternMedicline{})
	// 初始化中药表
	db.AutoMigrate(&model.ChineseMedicline{})
	// 初始化ICD-10表
	db.AutoMigrate(&model.ICD_10{})
	// 初始化医嘱表
	db.AutoMigrate(&model.MedicalOrder{})
	// 初始化医生病人映射表
	db.AutoMigrate(&model.DoctorPatientMapping{})
	// 初始化病历记录表
	db.AutoMigrate(&model.MedicalRecord{})
	// 打印初始化所有表成功信息
	fmt.Println("迁移所有表成功")
}

// func InitDBWithMongo() {
// 	dsn := "root:123456@tcp(127.0.0.1:3306)/prod?charset=utf8mb4&parseTime=True&loc=Local"
// 	var err error
// 	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
// 	if err != nil {
// 		log.Fatalf("Failed to connect to database: %v", err)
// 	}
// 	log.Println("Database connection established.")

// 	// 自动迁移表结构
// 	err = db.AutoMigrate(&model.PatientV2{}, &model.MedicalRecordV2{})
// 	if err != nil {
// 		log.Fatalf("Failed to migrate database: %v", err)
// 	}

// 	log.Println("Data seeding completed.")
// }

// db.createUser({
//     user: "root",
//     pwd: "123456",  // 替换为你的密码
//     roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
// });

// 删除Sqlite所有表
func dropAllTables(db *gorm.DB) error {
	// 获取所有表名
	tables, err := db.Migrator().GetTables()
	if err != nil {
		return err
	}

	// 删除所有表
	for _, tableName := range tables {
		// 不要删除这个表,这个表是sqlite的自动增长id
		if tableName == "sqlite_sequence" {
			continue
		}

		if err := db.Migrator().DropTable(tableName); err != nil {
			return err
		}
	}
	return nil
}

// 删除MySql所有表
func dropAllMySqlTables(db *gorm.DB) error {
	// 获取所有表名
	tables, err := db.Migrator().GetTables()
	if err != nil {
		return err
	}

	// 删除所有表
	for _, tableName := range tables {
		if err := db.Migrator().DropTable(tableName); err != nil {
			return err
		}
	}
	return nil
}
